Brain Linux LCDドライバ実装
初期化
LCDと通信する必要?
例えばSPI液晶の /drivers/gpu/drm/panel/panel-ilitek-ili9322.c だと中でSPI通信している
LCDIF (mxsfb) の中に通信系は実装してしまえばよいのでは?
出てくる気になった関数 in mxsfb_drv.c
mxsfb_create_output
mxsfb_out.c にある
DTからpanelかbridgeを見つけてきて drm_connector_helper_add でconnectorに接続する
drm_connector_init を呼ぶ
GraphVizによるコールスタック可視化
そのままでは関数が多すぎて大変なことになるので、ビューワーを使う
sudo apt install libgirepository1.0-dev からの pip install pycairo PyGObject xdot
DISPLAY=:0 python -m xdot
こんなかんじで rankdir=LR; を盛り込むと縦に並べてくれる 他のパラレルLCDを模倣?
ILI9322のpanel driverがある
ILI9322のcompatibleで探すとD-Link DIR-685というルーターとNASがくっついた製品が出る
ちなみに、 /drivers/input/keyboard/dlink-dir685-touchkeys.c みたいな参考になりそうなドライバが他にもある
なんかMIPI DBIというSpecらしい
実機のCE起動時の通信をスニッフ
ILI9805と9806G
9806Gのデータシートは普通に出てくる
結線
LCD_CS
いわゆるCS
LCD_CS (i.MX28)
CSX (Write)
NCS (Read)
LCD_RS
Lならコマンド、HならRAMデータかコマンドパラメータ
DCX (Write)
DNC (Read)
LCD_RD_E
H→L→H の立ち下がりエッジでLCDがデータを書き込み、立ち上がりエッジでMCUが読む
RDX (Write)
NRD (Read)
LCD_WR_RWN
H→L→H の立ち下がりエッジでMCUがデータを書き込み、立ち上がりエッジの時にLCDが読む
WRX (Write)
NWR (Read)
LCD_RESET
本当にRESETか怪しい LCDからVSYNC (tearing event) が来るのでそれの入力だった
RESX (Write)
NRESET (Read)
GPMI_ALE
LCDコントローラーとSoCボードの間のPCBでは "LCD_VDDIO18" と印字
その名の通り1.8Vを印加しないと正しく通信できない
GPMI_CLE
LCDコントローラーとSoCボードの間のPCBでは "LCDAV_CTRL" と印字
詳細は不明だが常に3.3VでPull-upされている
ENET_CLK
詳細は不明だがILI9805のリセットっぽい
Linuxドライバ
driver/gpu/drm/tiny/ili9341.* をベースにする
drm_simple_display_pipe_funcs を実装してシンプルな構成のディスプレイを設定させる
lcdifのcompatible: fsl,imx28-lcdif
ブートできん
fbdevを呼ぶ最中になんか console_lock で止まってる?
これはconsole_lockが本質なのではなく、console_lockによってlockされてる間に何かが起きているに違いない
fb.lockless_register_fb=1 をcmdlineに追加
やっぱりconsole_lock悪くなかった(RUNが終わってない)
RUNが終わらない
必要なクロックが有効になってなさそう
axi clkを有効にするやつがmxsfbのcrtcにいる
"axi" という名前のclkをどうやって見つけているか? demv_clk_get に渡しているconsumer idはclkのデバドラが決めるのではなくDTで決まってそう
imx28-clock.txt曰く <&clks 25> はhbusってことらしいがその数字はどうやって決まってる??
結論: クロックが止まってるわけではなく、U-Bootで設定したRUNを立てまくるDMAとぶつかって永遠にRUNのフラグが下がってなかった
flip_doneが伝わらない
どうやらeventを処理するだけでなく、drm_dev_enterを呼ばないといけないっぽい
VDDIO18に3.3V入れてたのを直してチェックメイト
DRI
All DRI drivers are made up of 3 parts:
- A DRI aware 2D driver which lives in xc/programs/Xserver/hw/xfree86/drivers/ usually in a file *dri.ch_. - A DRI aware 3D driver based on Mesa which lives in xc/lib/GL/mesa/src/drv/
- A kernel module which lives in xc/programs/Xserver/hw/xfree86/os-support/linux/drm/
要は2DグラフィックはXのDDXドライバと同じっていうことになる(?)
いや流石に厳しい…
TODO
VSYNC IRQで画面を描画?
参考